#include <iostream>
#include <string>
#include <regex>

using namespace std;

int main()
{
    string str = "GET /nightcord/yoisakikanade?user=asahinamafuyu&pass=210127 HTTP/1.1\r\n";

    regex reg("(GET|POST|PUT|DELETE|HEAD)([^?]*)(?:\\?(.*))? (HTTP/1\\.[10])(?:\n|\r\n)?");

    // '|': 表示或
    // '.': 表示匹配除换行符 \n 之外的任何单字符。要匹配 . ，请使用 \.
    // '[^?]*': 表示匹配 0 个或多个非 ? 字符
    // '\\?(.*) ':  '\\?'表示原始的 '?',(.*) 表示提取'?'后的任意个字符,直到遇到空格结束
    // '(HTTP/1\\.[10])': 表示匹配以HTTP/1.开头,后面是1或者0的字符串
    // '(?:\n|\r\n)?': '(?:)'表示匹配某个格式字符串，但不提取，最后的'?'表示前边的表达式匹配0次或1次

    smatch matches;

    bool ret = regex_match(str, matches, reg);
    if (ret == false)
        return -1;
    for (auto &s : matches)
    {
        cout << s << endl;
    }
    return 0;
}